package jdbc;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.util.Properties;

/**
    C3P0数据库连接池
 */
public class C3P0_ {

    public static void main(String[] args) {
        /*
            JDBC的数据库连接池使用javax.sql.DataSource来表示
            Datasource只是一个接口，该接口通常由第三方提供实现(提供jar包)
            1.C3P0数据库连接池
            2.DBCP数据库连接池
            3.Proxool数据库连接池
            4.BoneCP数据库连接池
            5.Druid数据库连接池
         */

        /*
            使用代码实现c3p0数据库连接池，配置文件放在src目录下
         */

    }

    @Test
    //方式1：相关参数，在程序中指定user url password
    public void testC3P0_01() throws Exception {

        //1. 创建数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        //2. 通过配置文件mysql3.properties获取相关信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql3.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        //3.给数据源 comboPooledDataSource 设置相关参数
        // 连接管理是由 comboPooledDataSource 来管理
        comboPooledDataSource.setDriverClass(driver);
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);

        // 设置初始化连接数
        comboPooledDataSource.setInitialPoolSize(10);
        // 设置最大连接数
        comboPooledDataSource.setMaxPoolSize(50);
        // 测试连接池效率，测试连接5000次
        //4.获取连接
        // getConnection() 就是实现的DataSource接口的方法
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection connection = comboPooledDataSource.getConnection();
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("C3P0 5000次耗时：" + (end - start) + "ms");//721ms

    }

    @Test
    //方式2：使用配置文件模板完成
    //将C3P0 提供的 c3p0.config.xml 拷贝到 src目录下
    //该文件制定了连接数据库和连接池的相关参数
    public void testC3P0_02() throws Exception {
        //1. 创建数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("lmy");
        //2. 直接连接
        Connection connection = comboPooledDataSource.getConnection();
        System.out.println("连接成功...");
        connection.close();
    }
}
